home *** CD-ROM | disk | FTP | other *** search
/ Super PC 34 / Super PC 34 (Shareware).iso / spc / UTIL / DJGPP2 / V2 / DJTST200.ZIP / tests / libc / ansi / math / elefunt / tsqrt.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-06-01  |  5.5 KB  |  211 lines

  1. /* -*-C-*- tsqrt.c */
  2.  
  3. #include "elefunt.h"
  4.  
  5. /*    PROGRAM TO TEST SQRT
  6. #
  7. #     DATA REQUIRED
  8. #
  9. #        NONE
  10. #
  11. #     SUBPROGRAMS REQUIRED FROM THIS PACKAGE
  12. #
  13. #        MACHAR - AN ENVIRONMENTAL INQUIRY PROGRAM PROVIDING
  14. #                 INFORMATION ON THE FLOATING-POINT ARITHMETIC
  15. #                 SYSTEM.  NOTE THAT THE CALL TO MACHAR CAN
  16. #                 BE DELETED PROVIDED THE FOLLOWING SIX
  17. #                 PARAMETERS ARE ASSIGNED THE VALUES INDICATED
  18. #
  19. #                 IBETA  - THE RADIX OF THE FLOATING-POINT SYSTEM
  20. #                 IT     - THE NUMBER OF BASE-IBETA DIGITS IN THE
  21. #                          SIGNIFICAND OF A FLOATING-POINT NUMBER
  22. #                 EPS    - THE SMALLEST POSITIVE FLOATING-POINT
  23. #                          NUMBER SUCH THAT 1.0+EPS .NE. 1.0
  24. #                 EPSNEG - THE SMALLEST POSITIVE FLOATING-POINT
  25. #                          NUMBER SUCH THAT 1.0-EPSNEG .NE. 1.0
  26. #                 XMIN   - THE SMALLEST NON-VANISHING FLOATING-POINT
  27. #                          POWER OF THE RADIX
  28. #                 XMAX   - THE LARGEST FINITE FLOATING-POINT NO.
  29. #
  30. #      RANDL(X) - A FUNCTION SUBPROGRAM RETURNING LOGARITHMICALLY
  31. #                 DISTRIBUTED RANDOM REAL NUMBERS.  IN PARTICULAR,
  32. #                        A * RANDL(ALOG(B/A))
  33. #                 IS LOGARITHMICALLY DISTRIBUTED OVER (A,B)
  34. #
  35. #        RAN(K) - A FUNCTION SUBPROGRAM RETURNING RANDOM REAL
  36. #                 NUMBERS UNIFORMLY DISTRIBUTED OVER (0,1)
  37. #
  38. #
  39. #     STANDARD FORTRAN SUBPROGRAMS REQUIRED
  40. #
  41. #         ABS, ALOG, AMAX1, FLOAT, SQRT
  42. #
  43. #
  44. #     LATEST REVISION - AUGUST 2, 1979
  45. #
  46. #     AUTHOR - W. J. CODY
  47. #              ARGONNE NATIONAL LABORATORY
  48. #
  49. *****************************************************************************/
  50.  
  51. void
  52. tsqrt()
  53. {
  54.     int i,
  55.         ibeta,
  56.         iexp,
  57.         irnd,
  58.         it,
  59.         j,
  60.         k1,
  61.     k2,
  62.         k3,
  63.         machep,
  64.         maxexp,
  65.         minexp,
  66.         n,
  67.         negep,
  68.         ngrd;
  69.     float a,
  70.         ait,
  71.         albeta,
  72.         b,
  73.         beta,
  74.         c,
  75.         eps,
  76.         epsneg,
  77.         r6,
  78.         r7,
  79.         sqbeta,
  80.         w,
  81.     x,
  82.         xmax,
  83.         xmin,
  84.         xn,
  85.         x1,
  86.         y,
  87.         z;
  88.  
  89.     /*******************************************************************/
  90.  
  91.     machar(&ibeta, &it, &irnd, &ngrd, &machep, &negep, &iexp, &minexp,
  92.        &maxexp, &eps, &epsneg, &xmin, &xmax);
  93.     beta = (float) ibeta;
  94.     sqbeta = sqrt(beta);
  95.     albeta = ALOG(beta);
  96.     ait = (float) it;
  97.     a = ONE / sqbeta;
  98.     b = ONE;
  99.     n = 2000;
  100.     xn = (float) n;
  101.  
  102.     /* random argument accuracy tests */
  103.  
  104.     for (j = 1; j <= 2; ++j)
  105.     {
  106.     c = ALOG(b / a);
  107.     k1 = 0;
  108.     k3 = 0;
  109.     x1 = ZERO;
  110.     r6 = ZERO;
  111.     r7 = ZERO;
  112.  
  113.     for (i = 1; i <= n; ++i)
  114.     {
  115.         x = a * randl(c);
  116.         y = x * x;
  117.         z = sqrt(y);
  118.         w = (z - x) / x;
  119.         if (w > ZERO)
  120.         k1 = k1 + 1;
  121.         if (w < ZERO)
  122.         k3 = k3 + 1;
  123.         w = ABS(w);
  124.         if (w > r6)
  125.         {
  126.         r6 = w;
  127.         x1 = x;
  128.         }
  129.         r7 = r7 + w * w;
  130.     }
  131.  
  132.     k2 = n - k1 - k3;
  133.     r7 = sqrt(r7 / xn);
  134.     printf("\fTEST OF SQRT(X*X) - X\n\n\n");
  135.     printf("%7d RANDOM ARGUMENTS WERE TESTED FROM THE INTERVAL\n", n);
  136.     printf("       (" F15P4E "," F15P4E ")\n\n\n", a, b);
  137.     printf(" SQRT(X) WAS LARGER%6d TIMES,\n", k1);
  138.     printf("             AGREED%6d TIMES, AND\n", k2);
  139.     printf("        WAS SMALLER%6d TIMES.\n\n\n", k3);
  140.     printf(
  141. " THERE ARE%4d BASE%4d SIGNIFICANT DIGITS IN A FLOATING-POINT NUMBER\n\n\n",
  142.         it, ibeta);
  143.     w = -999.0e0;
  144.     if (r6 != ZERO)
  145.         w = ALOG(ABS(r6)) / albeta;
  146.     printf(" THE MAXIMUM RELATIVE ERROR OF" F15P4E " = %4d **" F7P2F "\n",
  147.         r6, ibeta, w);
  148.     printf("    OCCURRED FOR X =" F17P6E "\n", x1);
  149.     w = AMAX1(ait + w, ZERO);
  150.     printf(
  151.         " THE ESTIMATED LOSS OF BASE%4d SIGNIFICANT DIGITS IS" F7P2F "\n\n\n",
  152.         ibeta, w);
  153.     w = -999.0e0;
  154.     if (r7 != ZERO)
  155.         w = ALOG(ABS(r7)) / albeta;
  156.     printf(" THE ROOT MEAN SQUARE RELATIVE ERROR WAS" F15P4E " = %4d **" F7P2F "\n",
  157.         r7, ibeta, w);
  158.     w = AMAX1(ait + w, ZERO);
  159.     printf(
  160.         " THE ESTIMATED LOSS OF BASE%4d SIGNIFICANT DIGITS IS" F7P2F "\n\n\n",
  161.         ibeta, w);
  162.     a = ONE;
  163.     b = sqbeta;
  164.     }
  165.  
  166.     /* special tests */
  167.  
  168.     printf("\fTEST OF SPECIAL ARGUMENTS\n\n\n");
  169.     x = xmin;
  170.     y = sqrt(x);
  171.     printf(" SQRT(XMIN) = SQRT(" F15P7E ") = " F15P7E "\n\n\n", x, y);
  172.     x = ONE - epsneg;
  173.     y = sqrt(x);
  174.     printf(" SQRT(1-EPSNEG) = SQRT(1-" F15P7E ") = " F15P7E "\n\n\n", epsneg, y);
  175.     x = ONE;
  176.     y = sqrt(x);
  177.     printf(" SQRT(1.0) = SQRT(" F15P7E ") = " F15P7E "\n\n\n", x, y);
  178.     x = ONE + eps;
  179.     y = sqrt(x);
  180.     printf(" SQRT(1+EPS) = SQRT(1+" F15P7E ") = " F15P7E "\n\n\n", eps, y);
  181.     x = xmax;
  182.     y = sqrt(x);
  183.     printf(" SQRT(XMAX) = SQRT(" F15P7E ") = " F15P7E "\n\n\n", x, y);
  184.  
  185.     /* test of error returns */
  186.  
  187.     printf("\fTEST OF ERROR RETURNS\n\n\n");
  188.  
  189.     x = ZERO;
  190.     printf(" SQRT WILL BE CALLED WITH THE ARGUMENT " F15P4E "\n", x);
  191.     printf(" THIS SHOULD NOT TRIGGER AN ERROR MESSAGE\n\n\n");
  192.     fflush(stdout);
  193.     errno = 0;
  194.     y = sqrt(x);
  195.     if (errno)
  196.     perror("sqrt()");
  197.     printf(" SQRT RETURNED THE VALUE " F15P4E "\n\n\n", y);
  198.  
  199.     x = -ONE;
  200.     printf("\nSQRT WILL BE CALLED WITH THE ARGUMENT " F15P4E "\n", x);
  201.     printf(" THIS SHOULD TRIGGER AN ERROR MESSAGE\n\n\n");
  202.     fflush(stdout);
  203.     errno = 0;
  204.     y = sqrt(x);
  205.     if (errno)
  206.     perror("sqrt()");
  207.     printf(" SQRT RETURNED THE VALUE " F15P4E "\n\n\n\n", y);
  208.  
  209.     printf(" THIS CONCLUDES THE TESTS\n");
  210. }
  211.